// ProjectName: go-learn-demo
// PackageName: redisybxb
// Description:
// Author: hy.bai
// Date: 2025-08-31, 星期日 21:27

package redisybxb

import (
	"context"
	"fmt"
	"github.com/redis/go-redis/v9"
	"log/slog"
)

func RedisDemo() {
	client, ctx, err := InitClient()
	if err != nil {
		slog.Error(fmt.Sprintf("Redis Init Error: %s", err.Error()))
	}
	// 1.生成List数据
	// 判断数据集合对应的key是否存在
	intCmd := client.Exists(*ctx, "redis-demo")
	if intCmd.Val() <= 0 {
		client.LPush(*ctx, "redis-demo", "a", "b", "c", "d", "e", "f", "g", "h", "i", "j", "k", "l", "m", "n", "o", "p", "q", "r", "s", "t", "u", "v", "w", "x", "y", "z")
	}

	// 2.定义分页数据和断点key
	checkpointKey := "my_checkpoint"
	page := 1      // 定义从第1页开始查询
	pageSize := 10 // 定义页面大小为10

	// 判断没有断点key时，才会设置为1
	cpkIntCmd := client.Exists(*ctx, checkpointKey)
	if cpkIntCmd.Val() <= 0 {
		client.Set(*ctx, checkpointKey, page, 0)
	}

	// 定义是否退出循环的标识
	stop := false
	// 3.获取上一次的断点位置
	strCmd := client.Get(*ctx, checkpointKey)
	if strCmd.Err() != nil {
		return
	}
	// 从断点中，获取查询到了哪一页
	page, _ = strCmd.Int()
	fmt.Println("从Redis中获取到断点是:", page)
	// 发起分页请求
	for !stop {
		// 从断点位置开始查询
		data := queryDataFromRedis(*ctx, client, page, pageSize)
		// 处理处理
		fmt.Println(fmt.Sprintf("page: %d, pageSize: %d, 数据是:%v", page, pageSize, data))
		// 更新断点
		page++
		client.Set(*ctx, checkpointKey, page, 0)
		// 更新循环结果的条件
		if len(data) < pageSize { // 检查是否达到退出循环的条件
			stop = true
			// 移除断点标记
			client.Del(*ctx, checkpointKey)
		}
		// 模拟异常
		if page == 5 {
			panic("模拟异常")
		}
	}
}

// 从模拟数据中，查询分页数据
func queryDataFromRedis(ctx context.Context, client *redis.Client, page int, pageSize int) []string {
	// slog.Info(fmt.Sprintf("page: %d, pageSize: %d", page, pageSize))
	start := (page - 1) * pageSize
	end := page*pageSize - 1
	return client.LRange(ctx, "redis-demo", int64(start), int64(end)).Val()
}

func TestDemo() {
	RedisDemo()
}
